iT邦幫忙

2025 iThome 鐵人賽

DAY 11
2
Modern Web

原生元件養成計畫:Web Component系列 第 11

Day 11: Web Component 應用-Modal 與 slot

  • 分享至 

  • xImage
  •  

其實 Modal 可以說是我想到最適合拿來說明 slot 這個概念的元件了!
在開發公司的應用時,常常大量需要用到彈出視窗,不管是 alert, confirm, 又或是預覽資料、檢視等等的功能。
但以上提到的 modal 型式,有的有 header,有的有 footer,有的都沒有。
要想符合這些需求,這時候,slot(插槽)就是一個很重要的東西!有學過 Vue 應該對 slot 不陌生了,而在 Web Component 也是一樣的概念!

先架構一下 template 中的插槽吧!


這個 modal 會有 headercontentfooter 三大區塊,所以我們利用 具名 slotslot name="區塊名稱"來定義我們要提供給外部使用的插槽。
slot

定義一個 Custom Element - custom-modal

modal.js

class CustomModal extends HTMLElement {
  constructor() {
    super();

    const shadowRoot = this.attachShadow({ mode: 'open' });
    const cloneNode = this.render().cloneNode(true);
    shadowRoot.appendChild(cloneNode);
  }
}

render() {
  const template = document.createElement('template');

  template.innerHTML = `
    <style>
      .modal-container {
        padding: 20px;
        background-color: #dddddd;
        border-radius: 6px;
      }

      .modal-header {
        font-size: 20px;
        font-weight: 500;
        padding-bottom: 4px;
      }

      .modal-content {
        padding: 4px;
        border-top: 1px solid #999999;
        border-bottom: 1px solid #999999;
      }
    </style>

    <!-- 定義 modal 結構 -->
    <div class="modal-container">
      <div class="modal-header">
        <!-- 加入 slot : header -->
        <slot name="header"></slot>
      </div>

      <div class="modal-content">
        <!-- 加入 slot : content -->
        <slot name="content">
          <p class="default-content">預設文字</p>
        </slot>
      </div>

      <div class="modal-footer">
        <!-- 加入 slot : footer -->
        <slot name="footer"></slot>
      </div>
    </div>
  `

  return template.content;
}

customElements.define('custom-modal', CustomModal);

外部使用 custom-modal
index.html

<body>
  <div style="display: flex; width: 100%; height: 100%; align-items: center; justify-content: center;">
    <custom-modal></custom-modal>
  </div>

  <script src="modal.js"></script>
</body>

先來看一下範例結果吧!

slot

可以從呈現畫面看見,我們在 template 中定義的 slot 只有 <slot name="content"></slot> 插槽中有放 預設內容 ,所以在外部套用者沒有給定任何插槽內容時,就會呈現我們一開始在元件中給定的 預設內容,也就是預設文字四個字。

試著在外部加入自訂內容!

  1. 在 header 加入標題
  2. 在 content 加入文字
  3. 在 footer 加入按鈕

index.html

<body>
  <div style="display: flex; width: 100%; height: 100%; align-items: center; justify-content: center;">
    <custom-modal>
      <div slot="header" style="display: flex; justify-content: flex-start;">
        <h4 style="margin: 0;">彈出視窗</h4>
      </div>

      <div slot="content">
        <p>
          注意!這是一個彈出視窗!
        </p>
      </div>

      <div slot="footer" style="display: flex; justify-content: flex-end; padding-top: 12px">
        <button>關閉按鈕</button>
      </div>
    </custom-modal>
  </div>

  <script src="modal.js"></script>
</body>

看看範例結果!

你會發現,透過 slot 插槽,我們可以使用自己定義的內容,並且可以替換掉原本元件預設的內容!
slot

第二元件的雛型已經出現了!
關於 slot 的應用就先介紹到這裡,下一步,我們終於要進入學習路徑中我認為最複雜的一項概念,也就是 樣式,我們下篇見囉!


上一篇
Day 10: Web Component 的插槽 Slot
下一篇
Day 12: Web Component 的樣式 style
系列文
原生元件養成計畫:Web Component13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言